﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using CPTECH.Repository;
using CPTECH.Business;

namespace CPTECH.Presentation
{
    public partial class frm_local : frm_default
    {
        int fluxo = 0;
        frm_alterarItem alterar = new frm_alterarItem();
        frm_validarInv validar = new frm_validarInv();

        public frm_local(frm_alterarItem sendedAlterar, frm_validarInv sendedValidar, int fluxoReceiv)
        {
            InitializeComponent();
            
            fluxo = fluxoReceiv;
            alterar = sendedAlterar;
            validar = sendedValidar;
        }

        //volta para o formulário anterior.
        private void mnu_voltar_Click(object sender, EventArgs e)
        {
            this.closeForm();//método herdado do form default.
        }

        //chama método que popula a listBox.
        private void frm_local_Load(object sender, EventArgs e)
        {
            showLocais();
        }

        //método que popula a list Box.
        private void showLocais()
        {
            lst_locais.Items.Clear();
            ArrayList resultado = LocalDB.getInstance().selectAllLocais();

            for (int i = 0; i < resultado.Count; i++)
            {
                lst_locais.Items.Add(resultado[i].ToString());
            }
        }

        //seta os valores selecionados nos texts.
        private void lst_locais_SelectedIndexChanged(object sender, EventArgs e)
        {
            string[] localSeparado = lst_locais.SelectedItem.ToString().Split('=');

            txt_codLocal.Text = "";
            txt_codLocal.Text = localSeparado[0].Trim();
            txt_descLocal.Text = "";
            txt_descLocal.Text = localSeparado[1].Trim();

        }

        //chama método que efetua verificação, salva e chama  o form seguinte
        private void mnu_prosseguir_Click(object sender, EventArgs e)
        {
            checkAndSave();
        }

        //método que efetua verificação, salva e chama  o form seguinte
        private void checkAndSave()
        {
            if (txt_codLocal.Text == "" || txt_descLocal.Text == "")
            {
                MessageBox.Show("Selecione um Local para continuar!", "Aviso");
                lst_locais.Focus();
            }
            else
            {
                //inventário
                if (fluxo == 0)
                {
                    FisicoBO.getInstance().codLocal = txt_codLocal.Text;

                    //checa pra ver se  o formulário Departamento foi marcado para ser chamado.
                    if (FisicoBO.getInstance().ckDepartamento)
                    {
                        frm_departamento departamento = new frm_departamento(null, null, 0);//craia instancia do novo form.
                        departamento.showForm(this);//exibe o form novo.
                    }

                    //checa pra ver se  o formulário Centro de Custo foi marcado para ser chamado.
                    else if (FisicoBO.getInstance().ckCcusto)
                    {
                        frm_cCusto Ccusto = new frm_cCusto(null, null, 0);//craia instancia do novo form.
                        Ccusto.showForm(this);//exibe o form novo.
                    }

                    //checa pra ver se  o formulário Planta foi marcado para ser chamado.
                    else if (FisicoBO.getInstance().ckPlanta)
                    {
                        frm_planta planta = new frm_planta(null, null, 0);//craia instancia do novo form.
                        planta.showForm(this);//exibe o form novo.
                    }

                    //chama o formulário de Fisico.
                    else
                    {
                        frm_fisico fisico = new frm_fisico();//cria instancia do novo form.
                        fisico.showForm(this);//exibi form novo.
                    }
                }
                //validar.
                else if (fluxo == 1)
                {
                    validar.sendedValues("local", txt_codLocal.Text.Trim());
                    this.closeForm();
                }
                //alterar
                else
                {
                    alterar.sendedValues("local", txt_codLocal.Text.Trim());
                    this.closeForm();
                }
            }
        }

        //verifica campos.
        private bool verificaCampos()
        {
            bool campos = false;

            if (txt_codLocal.Text == "")
            {
                MessageBox.Show("Insira um código de Local para continuar!", "Filial");
                txt_codLocal.Focus();
            }

            else if (txt_descLocal.Text == "")
            {
                MessageBox.Show("Insira uma descrição de Local para continuar!", "Filial");
                txt_descLocal.Focus();
            }
            else
            {
                campos = true;
            }

            return campos;
        }

        //muda botão de add para salvar e habilita os campos para inserção.
        private void activeInsert()
        {
            lst_locais.Enabled = false;
            bt_cancelar.Visible = true;
            txt_codLocal.Enabled = true;
            txt_codLocal.Text = "";
            txt_descLocal.Enabled = true;
            txt_descLocal.Text = "";
            txt_codLocal.Focus();
            bt_add.Text = "Salvar";
        }

        //muda opção de salvar para add e desabilita os campos pra inserção.
        private void desactiveInsert()
        {
            lst_locais.Enabled = true;
            bt_cancelar.Visible = false;
            txt_codLocal.Enabled = false;
            txt_codLocal.Text = "";
            txt_descLocal.Enabled = false;
            txt_descLocal.Text = "";
            lst_locais.Focus();
            bt_add.Text = "Add";
        }

        //checa texto (habilita para o insert *Add || ou salva o mesmo *Salvar)
        private void bt_add_Click(object sender, EventArgs e)
        {
            if (bt_add.Text == "Add")
            {
                activeInsert();
            }
            else
            {
                string os = FisicoBO.getInstance().os;
                string codFilial = FisicoBO.getInstance().codFilial;
                string codLocal = txt_codLocal.Text.Trim();
                string descLocal = txt_descLocal.Text.ToUpper();
                string data = DateTime.Now.ToString("yyyy-MM-dd");

                if (LocalDB.getInstance().checkCodLocal(codLocal))
                {
                    MessageBox.Show("Este código de Local já existe, favor informar um novo!", "Local");
                    txt_codLocal.Text = "";
                    txt_codLocal.Focus();
                }
                else if (verificaCampos())
                {
                    bool resposta = LocalDB.getInstance().insertNewLocal(os, codFilial, codLocal, descLocal, data, 1);

                    if (resposta == true)
                    {
                        desactiveInsert();
                        MessageBox.Show("Local inserido com sucesso!", "Local");
                        txt_codLocal.Text = codLocal.ToString();
                        txt_descLocal.Text = descLocal;
                        showLocais();
                    }

                    else if (resposta == false)
                    {
                        MessageBox.Show("Não foi possível adicionar o Local, cheque os valores informados!", "Local");
                        txt_codLocal.Focus();
                    }
                }
            }

        }

        //cancela insert de novo local.
        private void bt_cancelar_Click(object sender, EventArgs e)
        {
            desactiveInsert();
        }

        //permite apenas inserção de números neste campo.
        private void txt_codLocal_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!char.IsDigit(e.KeyChar))
            {
                e.Handled = true;
                MessageBox.Show("Somente números são permitidos neste campo!", "Aviso");
                txt_codLocal.Text = "";
                txt_codLocal.Focus();
            }
        }

    }
}